Saugus ir sklandus vartotojų autentifikavimas su OAuth2. Vadovas aprašo OAuth2 diegimą trečiųjų šalių prieigai: koncepcijas, eigą, patarimus kūrėjams.
OAuth2 diegimas: Išsamus trečiųjų šalių autentifikavimo vadovas
Šiandieniniame tarpusavyje susijusiame skaitmeniniame pasaulyje sklandus ir saugus vartotojų autentifikavimas yra itin svarbus. OAuth2 tapo pramonės standartiniu protokolu, leidžiančiu trečiųjų šalių programoms pasiekti vartotojo resursus kitoje tarnyboje neatskleidžiant jų prisijungimo duomenų. Šis išsamus vadovas gilinasi į OAuth2 diegimo subtilybes, suteikdamas kūrėjams žinių ir praktinių patarimų, reikalingų šiam galingam autorizavimo karkasui integruoti į savo programas.
Kas yra OAuth2?
OAuth2 (Open Authorization) yra autorizavimo karkasas, kuris leidžia trečiosios šalies programai gauti ribotą prieigą prie HTTP paslaugos vartotojo vardu, organizuojant vartotojo patvirtinimą arba leidžiant trečiosios šalies programai gauti prieigą savo vardu. OAuth2 orientuojasi į kliento kūrėjo paprastumą, tuo pačiu užtikrindamas specifines autorizavimo eigas žiniatinklio, darbastalio, mobiliosioms programoms ir namų pramogų įrenginiams.
Įsivaizduokite tai kaip automobilio parkavimą su prižiūrėtoju. Jūs atiduodate automobilio raktelius (prisijungimo duomenis) patikimam prižiūrėtojui (trečiosios šalies programai), kad jis galėtų pastatyti jūsų automobilį (pasiekti jūsų resursus) jums tiesiogiai nesuteikiant prieigos prie visko, kas yra jūsų automobilyje. Jūs išlaikote kontrolę ir visada galite atsiimti raktelius (atšaukti prieigą).
Pagrindinės OAuth2 koncepcijos
Norint sėkmingai įdiegti OAuth2, labai svarbu suprasti pagrindines koncepcijas:
- Resurso savininkas: subjektas, galintis suteikti prieigą prie apsaugoto resurso. Paprastai tai yra galutinis vartotojas.
- Resursų serveris: serveris, talpinantis apsaugotus resursus, kuris priima ir atsako į apsaugotų resursų užklausas, naudodamas prieigos raktus.
- Kliento programa: programa, prašanti prieigos prie apsaugotų resursų resurso savininko vardu. Tai gali būti žiniatinklio programa, mobilioji programėlė ar darbastalio programa.
- Autorizavimo serveris: serveris, kuris išduoda prieigos raktus kliento programai, sėkmingai autentifikavus resurso savininką ir gavus jo autorizaciją.
- Prieigos raktas: prisijungimo duomenys, atspindintys resurso savininko kliento programai suteiktą autorizaciją. Kliento programa jį naudoja prieiti prie apsaugotų resursų resursų serveryje. Prieigos raktai paprastai turi ribotą galiojimo laiką.
- Atnaujinimo raktas: prisijungimo duomenys, naudojami naujam prieigos raktui gauti, nereikalaujant, kad resurso savininkas pakartotinai autorizuotų kliento programą. Atnaujinimo raktai paprastai galioja ilgai ir turi būti saugiai saugomi.
- Prieigos sritis: apibrėžia konkrečius kliento programai suteiktus leidimus. Pavyzdžiui, kliento programai gali būti suteikta tik skaitymo prieiga prie vartotojo profilio, bet ne galimybė jį modifikuoti.
OAuth2 suteikimo tipai
OAuth2 apibrėžia kelis suteikimo tipus, kurių kiekvienas pritaikytas konkretiems naudojimo atvejams ir saugumo reikalavimams. Tinkamo suteikimo tipo pasirinkimas yra labai svarbus norint užtikrinti saugų ir patogų autentifikavimą.
1. Autorizavimo kodo suteikimas
Autorizavimo kodo suteikimas yra dažniausiai naudojamas ir rekomenduojamas suteikimo tipas žiniatinklio programoms. Jis apima kelių žingsnių procesą, kuris užtikrina, kad kliento slaptasis raktas niekada nebūtų atskleistas resurso savininko naršyklei. Jis skirtas konfidencialiems klientams (klientams, galintiems išlaikyti savo kliento slaptojo rakto konfidencialumą). Štai supaprastintas aprašymas:
- Kliento programa nukreipia resurso savininką į autorizavimo serverį.
- Resurso savininkas autentifikuojasi su autorizavimo serveriu ir suteikia leidimą kliento programai.
- Autorizavimo serveris nukreipia resurso savininką atgal į kliento programą su autorizavimo kodu.
- Kliento programa keičia autorizavimo kodą į prieigos raktą ir atnaujinimo raktą.
- Kliento programa naudoja prieigos raktą, kad pasiektų apsaugotus resursus resursų serveryje.
Pavyzdys: Vartotojas nori prijungti savo Google Drive paskyrą prie trečiosios šalies dokumentų redagavimo programos. Programa nukreipia vartotoją į Google autentifikavimo puslapį, kur jis prisijungia ir suteikia programai leidimą pasiekti savo Google Drive failus. Tuomet Google nukreipia vartotoją atgal į programą su autorizavimo kodu, kurį programa iškeičia į prieigos raktą ir atnaujinimo raktą.
2. Netiesioginis suteikimas
Netiesioginis suteikimas yra supaprastinta autorizavimo kodo suteikimo versija, skirta kliento programoms, kurios negali saugiai saugoti kliento slaptojo rakto, pavyzdžiui, vieno puslapio programoms (SPA), veikiančioms žiniatinklio naršyklėje, arba vietinėms mobiliosioms programoms. Naudojant šį suteikimo tipą, prieigos raktas tiesiogiai grąžinamas kliento programai, kai resurso savininkas autentifikuojasi su autorizavimo serveriu. Tačiau jis laikomas mažiau saugiu nei autorizavimo kodo suteikimas dėl prieigos rakto perėmimo rizikos.
Svarbi pastaba: Netiesioginis suteikimas dabar didžiąja dalimi laikomas pasenusiu. Saugumo geriausioji praktika rekomenduoja vietoj jo naudoti autorizavimo kodo suteikimą su PKCE (Proof Key for Code Exchange), net ir SPA bei vietinėms programoms.
3. Resurso savininko slaptažodžio prisijungimo duomenų suteikimas
Resurso savininko slaptažodžio prisijungimo duomenų suteikimas leidžia kliento programai gauti prieigos raktą, tiesiogiai pateikiant resurso savininko vartotojo vardą ir slaptažodį autorizavimo serveriui. Šis suteikimo tipas turėtų būti naudojamas tik tada, kai kliento programa yra labai patikima ir turi tiesioginį ryšį su resurso savininku. Paprastai jis nerekomenduojamas dėl saugumo rizikos, susijusios su tiesioginiu prisijungimo duomenų bendrinimu su kliento programa.
Pavyzdys: Banko sukurta pirminė mobilioji programa gali naudoti šį suteikimo tipą, kad leistų vartotojams pasiekti savo sąskaitas. Tačiau trečiųjų šalių programos paprastai turėtų vengti šio suteikimo tipo.
4. Kliento prisijungimo duomenų suteikimas
Kliento prisijungimo duomenų suteikimas leidžia kliento programai gauti prieigos raktą naudojant savo prisijungimo duomenis (kliento ID ir kliento slaptąjį raktą), užuot veikus resurso savininko vardu. Šis suteikimo tipas paprastai naudojamas bendravimui tarp serverių arba kai kliento programai reikia tiesiogiai pasiekti resursus, kurių ji yra savininkė.
Pavyzdys: Stebėjimo programa, kuriai reikia pasiekti serverio metriką iš debesies paslaugų teikėjo, gali naudoti šį suteikimo tipą.
5. Atnaujinimo rakto suteikimas
Atnaujinimo rakto suteikimas leidžia kliento programai gauti naują prieigos raktą naudojant atnaujinimo raktą. Tai leidžia kliento programai išlaikyti prieigą prie apsaugotų resursų, nereikalaujant, kad resurso savininkas pakartotinai autorizuotų programą. Atnaujinimo raktas keičiamas į naują prieigos raktą ir, pasirinktinai, naują atnaujinimo raktą. Senasis prieigos raktas tampa negaliojančiu.
OAuth2 diegimas: Žingsnis po žingsnio vadovas
OAuth2 diegimas apima kelis pagrindinius žingsnius:
1. Kliento programos registravimas
Pirmasis žingsnis yra užregistruoti kliento programą autorizavimo serveryje. Tai paprastai apima informacijos, tokios kaip programos pavadinimas, aprašymas, nukreipimo URI (kur autorizavimo serveris nukreips resurso savininką po autentifikavimo) ir norimi suteikimo tipai, pateikimą. Autorizavimo serveris tuomet išduos kliento ID ir kliento slaptąjį raktą, kurie bus naudojami jūsų programai identifikuoti ir autentifikuoti.
Pavyzdys: Registruodami savo programą Google OAuth2 tarnyboje, turėsite pateikti nukreipimo URI, kuris turi atitikti URI, kurį jūsų programa naudos autorizavimo kodui gauti. Taip pat turėsite nurodyti sritis, kurių reikia jūsų programai, pvz., prieigą prie Google Drive ar Gmail.
2. Autorizavimo eigos inicijavimas
Kitas žingsnis yra inicijuoti autorizavimo eigą. Tai apima resurso savininko nukreipimą į autorizavimo serverio autorizavimo galinį tašką. Autorizavimo galiniam taškui paprastai reikalingi šie parametrai:
client_id: Kliento ID, išduotas autorizavimo serverio.redirect_uri: URI, į kurį autorizavimo serveris nukreips resurso savininką po autentifikavimo.response_type: Tikėtinas atsako tipas iš autorizavimo serverio (pvz.,codeautorizavimo kodo suteikimui).scope: Norimos prieigos sritys.state: Neprivalomas parametras, naudojamas siekiant užkirsti kelią tarp svetainių užklausų klastojimo (CSRF) atakoms.
Pavyzdys: Nukreipimo URI gali atrodyti taip: https://example.com/oauth2/callback. Parametras state yra atsitiktinai sugeneruota eilutė, kurią jūsų programa gali naudoti patikrinti, ar atsakas iš autorizavimo serverio yra teisėtas.
3. Autorizavimo atsako apdorojimas
Po to, kai resurso savininkas autentifikuojasi su autorizavimo serveriu ir suteikia leidimą kliento programai, autorizavimo serveris nukreips resurso savininką atgal į kliento programos nukreipimo URI su autorizavimo kodu (autorizavimo kodo suteikimui) arba prieigos raktu (netiesioginiam suteikimui). Kliento programa tuomet turi tinkamai apdoroti šį atsakymą.
Pavyzdys: Jei autorizavimo serveris grąžina autorizavimo kodą, kliento programa turi jį iškeisti į prieigos raktą ir atnaujinimo raktą, atlikdama POST užklausą autorizavimo serverio rakto galiniam taškui. Rakto galiniam taškui paprastai reikalingi šie parametrai:
grant_type: Suteikimo tipas (pvz.,authorization_code).code: Autorizavimo kodas, gautas iš autorizavimo serverio.redirect_uri: Tas pats nukreipimo URI, naudotas autorizavimo užklausoje.client_id: Kliento ID, išduotas autorizavimo serverio.client_secret: Kliento slaptasis raktas, išduotas autorizavimo serverio (konfidencialiems klientams).
4. Prieiga prie apsaugotų resursų
Kliento programai gavus prieigos raktą, ji gali jį naudoti prieigai prie apsaugotų resursų resursų serveryje. Prieigos raktas paprastai įtraukiamas į HTTP užklausos Authorization antraštę, naudojant Bearer schemą.
Pavyzdys: Norėdama pasiekti vartotojo profilį socialinės žiniasklaidos platformoje, kliento programa gali atlikti tokią užklausą:
GET /api/v1/me HTTP/1.1
Host: api.example.com
Authorization: Bearer [prieigos_raktas]
5. Rakto atnaujinimo valdymas
Prieigos raktai paprastai turi ribotą galiojimo laiką. Pasibaigus prieigos rakto galiojimui, kliento programa gali naudoti atnaujinimo raktą naujam prieigos raktui gauti, nereikalaujant, kad resurso savininkas pakartotinai autorizuotų programą. Norėdama atnaujinti prieigos raktą, kliento programa atlieka POST užklausą autorizavimo serverio rakto galiniam taškui su šiais parametrais:
grant_type: Suteikimo tipas (pvz.,refresh_token).refresh_token: Atnaujinimo raktas, gautas iš autorizavimo serverio.client_id: Kliento ID, išduotas autorizavimo serverio.client_secret: Kliento slaptasis raktas, išduotas autorizavimo serverio (konfidencialiems klientams).
Saugumo aspektai
OAuth2 yra galingas autorizavimo karkasas, tačiau svarbu jį įdiegti saugiai, siekiant apsaugoti vartotojo duomenis ir užkirsti kelią atakoms. Štai keletas pagrindinių saugumo aspektų:
- Naudokite HTTPS: Visas ryšys tarp kliento programos, autorizavimo serverio ir resursų serverio turėtų būti užšifruotas naudojant HTTPS, siekiant išvengti pasiklausymo.
- Patvirtinkite nukreipimo URI: Atidžiai patvirtinkite nukreipimo URI, kad išvengtumėte autorizavimo kodo įterpimo atakų. Leiskite tik registruotus nukreipimo URI ir užtikrinkite, kad jie būtų tinkamai suformatuoti.
- Apsaugokite kliento slaptuosius raktus: Išlaikykite kliento slaptuosius raktus konfidencialius. Niekada nesaugokite jų kliento pusės kode ir neatskleiskite jų neįgaliotiems asmenims.
- Įdiekite būsenos parametrą: Naudokite
stateparametrą, kad išvengtumėte CSRF atakų. - Patvirtinkite prieigos raktus: Resursų serveris turi patvirtinti prieigos raktus prieš suteikdamas prieigą prie apsaugotų resursų. Tai paprastai apima rakto parašo ir galiojimo laiko patikrinimą.
- Įdiekite prieigos sritį: Naudokite prieigos sritis, kad apribotumėte kliento programai suteiktus leidimus. Suteikite tik minimalius būtinus leidimus.
- Rakto saugojimas: Saugiai saugokite raktus. Vietinėms programoms apsvarstykite galimybę naudoti operacinės sistemos saugaus saugojimo mechanizmus. Žiniatinklio programoms naudokite saugius slapukus arba serverio pusės sesijas.
- Apsvarstykite PKCE (Proof Key for Code Exchange): Programoms, kurios negali saugiai saugoti kliento slaptojo rakto (pvz., SPA ir vietinėms programoms), naudokite PKCE, kad sumažintumėte autorizavimo kodo perėmimo riziką.
OpenID Connect (OIDC)
OpenID Connect (OIDC) yra autentifikavimo sluoksnis, sukurtas ant OAuth2. Jis suteikia standartizuotą būdą kliento programoms patikrinti resurso savininko tapatybę, remiantis autorizavimo serverio atliktu autentifikavimu, taip pat gauti pagrindinę profilio informaciją apie resurso savininką sąveikiu ir REST-panašiu būdu.
Nors OAuth2 pirmiausia yra autorizavimo karkasas, OIDC prideda autentifikavimo komponentą, todėl jis tinka naudoti tais atvejais, kai reikia ne tik autorizuoti prieigą prie resursų, bet ir patvirtinti vartotojo tapatybę. OIDC pristato ID Rakto koncepciją, kuris yra JSON Web Token (JWT), turintis teiginių apie vartotojo tapatybę.
Įdiegiant OIDC, autorizavimo serverio atsakas apims tiek prieigos raktą (prieigai prie apsaugotų resursų), tiek ID raktą (vartotojo tapatybei patvirtinti).
OAuth2 teikėjo pasirinkimas
Galite arba įdiegti savo OAuth2 autorizavimo serverį, arba naudoti trečiosios šalies teikėją. Savo autorizavimo serverio diegimas gali būti sudėtingas ir atimti daug laiko, tačiau jis suteikia jums visišką autentifikavimo proceso kontrolę. Trečiosios šalies teikėjo naudojimas dažnai yra paprastesnis ir ekonomiškesnis, tačiau tai reiškia, kad autentifikavimui pasikliaujate trečiąja šalimi.
Kai kurie populiarūs OAuth2 teikėjai:
- Google Identity Platform
- Facebook Login
- Microsoft Azure Active Directory
- Auth0
- Okta
- Ping Identity
Renkantis OAuth2 teikėją, atsižvelkite į šiuos veiksnius:
- Kainodara
- Funkcijos
- Saugumas
- Patikimumas
- Integracijos paprastumas
- Atitikties reikalavimai (pvz., GDPR, CCPA)
- Kūrėjų palaikymas
OAuth2 skirtingose aplinkose
OAuth2 naudojamas įvairiose aplinkose – nuo žiniatinklio programų ir mobiliųjų programėlių iki darbastalio programų ir daiktų interneto (IoT) įrenginių. Konkretūs diegimo ypatumai gali skirtis priklausomai nuo aplinkos, tačiau pagrindinės koncepcijos ir principai išlieka tie patys.
Žiniatinklio programos
Žiniatinklio programose OAuth2 paprastai diegiamas naudojant autorizavimo kodo suteikimą su serverio pusės kodu, valdančiu rakto keitimą ir saugojimą. Vieno puslapio programoms (SPA) rekomenduojamas autorizavimo kodo suteikimas su PKCE.
Mobiliosios programos
Mobiliosiose programose OAuth2 paprastai diegiamas naudojant autorizavimo kodo suteikimą su PKCE arba vietinį SDK, kurį teikia OAuth2 teikėjas. Svarbu saugiai saugoti prieigos raktus naudojant operacinės sistemos saugaus saugojimo mechanizmus.
Darbastalio programos
Darbastalio programose OAuth2 gali būti diegiamas naudojant autorizavimo kodo suteikimą su įterptuoju naršyklės komponentu arba sistemine naršykle. Panašiai kaip mobiliosiose programose, svarbu saugiai saugoti prieigos raktus.
Daiktų interneto (IoT) įrenginiai
Daiktų interneto (IoT) įrenginiuose OAuth2 diegimas gali būti sudėtingesnis dėl ribotų šių įrenginių resursų ir saugumo apribojimų. Priklausomai nuo konkrečių reikalavimų, gali būti naudojamas kliento prisijungimo duomenų suteikimas arba supaprastinta autorizavimo kodo suteikimo versija.
Dažnų OAuth2 problemų sprendimas
OAuth2 diegimas kartais gali būti sudėtingas. Štai keletas dažnų problemų ir kaip jas išspręsti:
- Neteisingas nukreipimo URI: Įsitikinkite, kad autorizavimo serveryje užregistruotas nukreipimo URI atitinka autorizavimo užklausoje naudojamą URI.
- Neteisingas kliento ID arba slaptasis raktas: Dar kartą patikrinkite, ar kliento ID ir kliento slaptasis raktas yra teisingi.
- Neautorizuota prieigos sritis: Įsitikinkite, kad autorizavimo serveris palaiko prašomas prieigos sritis ir kad kliento programai suteiktas leidimas prie jų prieiti.
- Prieigos raktas pasibaigęs: Naudokite atnaujinimo raktą naujam prieigos raktui gauti.
- Rakto patvirtinimas nepavyko: Įsitikinkite, kad resursų serveris tinkamai sukonfigūruotas patvirtinti prieigos raktus.
- CORS klaidos: Jei susiduriate su skirtingų šaltinių resursų bendrinimo (CORS) klaidomis, įsitikinkite, kad autorizavimo serveris ir resursų serveris yra tinkamai sukonfigūruoti, kad leistų užklausas iš jūsų kliento programos šaltinio.
Išvada
OAuth2 yra galingas ir universalus autorizavimo karkasas, kuris leidžia saugiai ir sklandžiai autentifikuoti vartotojus įvairiose programose. Supratę pagrindines koncepcijas, suteikimo tipus ir saugumo aspektus, kūrėjai gali efektyviai įdiegti OAuth2, siekiant apsaugoti vartotojo duomenis ir užtikrinti puikią vartotojo patirtį.
Šis vadovas pateikė išsamią OAuth2 diegimo apžvalgą. Nepamirškite peržiūrėti oficialių OAuth2 specifikacijų ir pasirinkto OAuth2 teikėjo dokumentacijos, kad gautumėte išsamesnės informacijos ir patarimų. Visada teikite pirmenybę geriausiai saugumo praktikai ir sekite naujausias rekomendacijas, kad užtikrintumėte vartotojo duomenų vientisumą ir konfidencialumą.